﻿#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int DataType;

typedef struct ListNode {
	struct ListNode* prev;
	struct ListNode* next;
	DataType data;
}ListNode;

// 带头双向循环链表-工具函数
// 构建新节点
ListNode* BuyListNode(DataType data);

// 带头双向循环链表-基本操作函数
// 初始化
void DoubleLinkedListInit(ListNode** pphead);
// 头部插入
void DoubleLinkedListPushFront(ListNode* phead, DataType elem);
// 头部删除
void DoubleLinkedListPopFront(ListNode* phead);
// 尾部插入
void DoubleLinkedListPushBack(ListNode* phead, DataType elem);
// 尾部删除
void DoubleLinkedListPopBack(ListNode* phead);
// 在第pos位置的后面插入
void DoubleLinkedListInsert(ListNode* phead, size_t pos, DataType elem);
// 删除第pos位置后面的元素
void DoubleLinkedListErase(ListNode* phead, size_t pos);
// 查找指定数值的节点
ListNode* DoubleLinkedListFind(ListNode* phead, DataType elem);
// 获取链表长度
size_t DoubleLinkedListLength(ListNode* phead);
// 正序遍历
void DoubleLinkedListTraverse(ListNode* phead);
// 倒序遍历
void DoubleLinkedListRetraverse(ListNode* phead);